# app/routes/users.py
from flask import Blueprint, request, jsonify
from app import db
from app.models import User
from app.routes.auth import token_required # 导入认证装饰器

bp = Blueprint('users', __name__)

# --- 用户管理 API (假设主要供管理员使用) ---

@bp.route('', methods=['GET'])
@token_required(required_role='admin') # 只有管理员能获取用户列表
def get_users(current_user):
    """获取用户列表 (带分页)"""
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    per_page = min(per_page, 100)

    query = User.query.order_by(User.id.asc())
    paginated_users = query.paginate(page=page, per_page=per_page, error_out=False)

    # 使用 to_dict 转换，不包含敏感信息
    results = [u.to_dict() for u in paginated_users.items]

    return jsonify({
        'users': results,
        'total_pages': paginated_users.pages,
        'current_page': paginated_users.page,
        'total_items': paginated_users.total,
        'per_page': paginated_users.per_page
    }), 200

@bp.route('/<int:id>', methods=['GET'])
@token_required(required_role='admin') # 只有管理员能获取指定用户信息
def get_user(current_user, id):
    """获取指定 ID 的用户信息"""
    user = User.query.get_or_404(id)
    return jsonify(user.to_dict()), 200 # 不含密码哈希

@bp.route('/<int:id>', methods=['PUT'])
@token_required(required_role='admin') # 只有管理员能修改用户信息
def update_user(current_user, id):
    """修改指定 ID 的用户信息 (例如角色)"""
    user = User.query.get_or_404(id)
    data = request.get_json()
    if not data:
        return jsonify({"error": "请求体不能为空"}), 400

    # 允许管理员修改的字段 (示例：角色)
    if 'role' in data:
        new_role = data['role']
        if new_role not in ['normal', 'admin']:
            return jsonify({"error": "无效的角色值"}), 400
        # 防止管理员误将最后一个管理员改为普通用户？ (可选的业务逻辑)
        # if user.role == 'admin' and new_role == 'normal':
        #     admin_count = User.query.filter_by(role='admin').count()
        #     if admin_count <= 1:
        #         return jsonify({"error": "不能移除最后一个管理员的角色"}), 400
        user.role = new_role

    # 通常不在此处修改用户名，如果需要，要检查唯一性
    # 通常不在此处修改密码，应提供单独的重置密码流程

    db.session.commit()
    return jsonify(user.to_dict()), 200

@bp.route('/<int:id>', methods=['DELETE'])
@token_required(required_role='admin') # 只有管理员能删除用户
def delete_user(current_user, id):
    """删除指定 ID 的用户"""
    user = User.query.get_or_404(id)

    # 安全检查：不能删除自己
    if user.id == current_user.id:
        return jsonify({"error": "不能删除自己"}), 400

    # **重要考虑**: 删除用户时，如何处理该用户提交的成果？
    # 1. 级联删除 (数据库层面设置 ON DELETE CASCADE) - 不推荐，数据丢失
    # 2. 置空 submitter_id (ON DELETE SET NULL) - 成果保留但失去提交者信息
    # 3. 阻止删除 (默认行为，如果外键约束存在) - 最安全，但需要先处理成果
    # 4. 软删除用户 (添加 is_deleted 字段) - 推荐，保留数据完整性

    # 假设我们不允许直接删除有成果的用户 (需要先处理成果)
    if user.submitted_outcomes.first():
         return jsonify({"error": "无法删除，该用户有关联的成果记录"}), 400

    db.session.delete(user)
    db.session.commit()
    return '', 204 # No Content
